(define (equal? a b)
    (cond 
        ((and (not (pair? a)) (not (pair? b))) 
            (eq? a b)
        )        
        ((and (pair? a) (pair? b)) 
            (and 
                (equal? (car a) (car b))
                (equal? (cdr a) (cdr b))
            )
        )
        (else #f)
    )
)



(define (make-table same-key?)
    (define (assoc key records)
        (cond 
            ((null? records) #f)
            ((same-key? key (caar records)) (car records))
            (else (assoc key (cdr records)))
        )
    )
    (let 
        (
            (local-table (list `*table*))
        )
        (define (lookup key-1 key-2)
            (let 
                (
                    (subtable (assoc key-1 (cdr local-table)))    
                )
                (if subtable
                    (let
                        (
                            (record (assoc key-2 (cdr subtable)))
                        ) 
                        (if record
                            (cdr record)
                            false
                        )
                    )
                )
            )
        )
        (define (insert! key-1 key-2 value)
            (let 
                (
                    (subtable (assoc key-1 (cdr local-table)))
                )
                (if subtable
                    (let
                        (
                            (record (assoc key-2 (cdr subtable)))
                        ) 
                        (if record
                            (set-cdr! record value)
                            (set-cdr! 
                                subtable
                                (cons 
                                    (cons key-2 value)
                                    (cdr subtable)
                                )
                            )
                        )
                    )
                    (set-cdr! 
                        local-table
                        (cons 
                            (list key-1 (cons key-2 value))
                            (cdr local-table)
                        )
                    )
                )
            )
            `ok
        )        
    
        (define (dispatch m)
            (cond 
                ((eq? m `lookup-proc) lookup)
                ((eq? m `insert-proc) insert!)
                (else (error "unknow operation -- TABLE" m))
            )
        )
        dispatch
    )
)
(define operation-table (make-table =))
(define get (operation-table `lookup-proc))
(define put (operation-table `insert-proc))

(display (put 1 1 `xxxx))
(newline)
(display (get 1 1))


(exit)